package top.lixunda.ecommerce.server.good.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.multipart.MultipartFile;
import top.lixunda.ecommerce.server.good.api.entity.db.GoodsDO;
import top.lixunda.ecommerce.server.good.api.entity.dto.*;
import top.lixunda.ecommerce.server.business.api.entity.dto.PageDTO;
import top.lixunda.ecommerce.server.good.api.entity.vo.GoodGroupVO;
import top.lixunda.ecommerce.server.good.api.entity.vo.SysGoodCategoryVO;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * <p>
 * 商品表 goods 服务类
 * </p>
 *
 * @author Xumda
 * @since 2019-12-18
 */
public interface IGoodsService extends IService<GoodsDO> {

    /**
     * 根据id获取多个商品数据
     * 只能查询普通用户可见的商品信息
     *
     * @param ids 商品id列表
     * @return 商品列表
     */
    List<GoodsDO> queryByIds(List<Integer> ids);

    /**
     * 根据条件筛选商品信息，需要分页
     * 只能查询普通用户可见的商品信息
     *
     * @param pageDTO 查询条件DTO
     * @return 商品列表
     */
    IPage<GoodsDO> queryGoodsByPage(PageDTO<GoodsDO, GoodsQueryDTO> pageDTO);

    /**
     * 根据id获取多个商品数据
     * 商家端调用，只能查询该店铺的商品信息
     *
     * @param ids 商品id列表
     * @return 商品列表
     */
    List<GoodsDO> queryByIdsStore(List<Integer> ids);

    /**
     * 根据条件筛选商品信息，需要分页
     * 商家端调用，只能查询该店铺的商品信息
     *
     * @param pageDTO 查询条件DTO
     * @return 商品列表
     */
    IPage<GoodsDO> queryGoodsByPageWrapperStore(
            PageDTO<GoodsDO, GoodsStoreQueryDTO> pageDTO);

    /**
     * 根据id获取多个商品数据
     * 管理员端调用，可以查询所有商品信息
     *
     * @param ids 商品id列表
     * @return 商品列表
     */
    List<GoodsDO> queryByIdsAdmin(List<Integer> ids);

    /**
     * 根据条件筛选商品信息，需要分页
     * 管理员端调用，可以查询所有商品信息
     *
     * @param pageDTO 查询条件DTO
     * @return 商品列表
     */
    IPage<GoodsDO> queryGoodsByPageWrapperAdmin(
            PageDTO<GoodsDO, GoodsAdminQueryDTO> pageDTO);

    /**
     * 添加商品新的商品数据
     *
     * @param files 商品图片
     * @param goodsInsertDTO 商品数据
     * @return 返回是否添加成功
     */
    Boolean addGood(MultipartFile[] files, GoodsInsertDTO goodsInsertDTO);

    /**
     * 修改商品信息DTO
     *
     * @param files 需要添加的商品图片
     * @param goodsChangeDTO 修改的商品数据
     * @return 是否修改成功
     */
    Boolean changeGood(MultipartFile[] files, GoodsChangeDTO goodsChangeDTO);

    /**
     * 根据id移除商品信息，店铺调用，只能移除自己店铺的商品数据
     *
     * @param ids 商品id
     * @return 是否移除成功
     */
    Boolean removeGoodsByIds(List<Integer> ids);

    /**
     * 根据子商品id列表移除子商品数据，店铺调用，只能移除自己店铺的商品数据，且移除后该商品至少包含一个子商品
     *
     * @param ids 子商品id列表
     * @return 是否移除成功
     */
    Boolean removeSubGoodsByIds(List<Integer> ids);

    /**
     * 店铺调用，查询当前店铺中商品的所有Category信息
     *
     * @return List<SysGoodCategoryVO>
     */
    List<SysGoodCategoryVO> queryStoreGoodCategory();

    /**
     * 店铺调用，查询当前店铺中商品的所有Group信息
     *
     * @return List<SysGoodCategoryVO>
     */
    List<GoodGroupVO> queryStoreGoodGroup();

    /**
     * 店铺调用，查询当前店铺中商品的所有SellPoint信息
     *
     * @return List<SysGoodCategoryVO>
     */
    List<String> queryStoreGoodSellPoint();

    /**
     * 店铺调用，查询当前店铺中商品的所有Freight信息
     *
     * @return List<SysGoodCategoryVO>
     */
    List<BigDecimal> queryStoreGoodFreight();

    /**
     * 店铺调用，查询当前店铺中商品的部分信息筛选项
     *
     * @return Map String,List
     */
    Map<String, Set> queryStoreGoodTableFilter();

    /**
     * 店铺调用，提交商品进行审核
     *
     * @param ids 商品数据id列表
     * @return 是否提交申请成功
     */
    Boolean pushGoodsCheckPending(List<Integer> ids);

    /**
     * 店铺调用，取消提交的商品审核
     *
     * @param ids 商品数据id列表
     * @return 是否成功取消
     */
    Boolean cancelGoodsCheckPending(List<Integer> ids);

    /**
     * 店铺调用，上架商品
     *
     * @param ids 商品数据id列表
     * @return 是否上架成功
     */
    Boolean pushGoods(List<Integer> ids);

    /**
     * 店铺调用，下架商品
     *
     * @param ids 商品数据id列表
     * @return 是否下架成功
     */
    Boolean pullGoods(List<Integer> ids);

    /**
     * 管理员调用，审核添加的商品
     *
     * @param list 审核数据信息
     * @return 审核结果
     */
    Boolean checkingGoods(List<AdminCheckingDTO> list);

}
